﻿#pragma once
#include<windows.h>    //隐藏光标信息
#include<stdbool.h>    //false
#include<stdlib.h>     //system函数
#include<stdio.h>
#include<time.h>       

#define POS_X 24
#define POS_Y 5     //定义蛇头节点初始坐标

#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'
//类型的声明

//1.蛇身的节点类型
typedef struct SnakeNode
{
	int x;
	int y; //数据域 - 坐标
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;    //结构体重命名为snakeNode，结构体指针重命名为*pSnakeNod

//（2）枚举蛇的方向
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

//(2)枚举游戏进行状态
enum GAME_STATUS
{
	OK,            //游戏正常运行
	KILL_BY_WALL,  //撞墙
	KILL_BY_SELF,  //撞到自己
	END            //游戏正常退出
};

//2.贪吃蛇(定义游戏各种属性）  
typedef struct Snake
{
	pSnakeNode _pSnake;   //定义指向蛇头的指针
	pSnakeNode _pFood;    //定义指向食物的指针
	enum DIRECTION _Dir; //定义蛇的方向（上下左右）  
	enum GAME_STATUS _Status;//游戏运行状态
	int _Food_weight;     //一个食物的分数
	int _Score;    //总分数
	int _Sleep_time;     //通过sleep休息时间来决定速度快慢
}Snake, *pSnake;  //给结构体及其指针重命名



//3.函数的声明

//定位光标位置
void SetPos(short x, short y);

//游戏的初始化
void GameStart(pSnake ps);

//欢迎界面的打印
void WelcomeToGame();

//2.地图绘制
void CreateMap();

//3.创建蛇（初始化蛇）
void InitSnake(pSnake ps);   //指向贪吃蛇的指针

//创建食物
void CreateFood(pSnake ps);

//游戏运行的逻辑
void GameRun(pSnake ps);

//蛇的移动，走一步发生的情况
void SnakeMove(pSnake ps);

//判断下一个坐标是否有食物
int NextIsFood(pSnakeNode pn, pSnake ps);     //pn是指向蛇即将到达的下一个位置的指针  ps是指向蛇头的指针

//下一个位置有食物就吃掉
void EatFood(pSnakeNode pn, pSnake ps);

//下一个位置不是食物
void NoFood(pSnakeNode pn, pSnake ps);

//检测蛇是否撞墙
void KillByWall(pSnake ps);

//检测蛇是否撞到了自己
void KillBySelf(pSnake ps);

//游戏善后的工作
void GameEnd(pSnake ps);